package leetcode_day._2021._202111;

/**
 * @author yzh
 * @version 1.0
 * @date 2021/11/14 17:22
 * 键值映射
 * 实现一个 MapSum 类，支持两个方法，insert 和 sum：
 * MapSum() 初始化 MapSum 对象
 * void insert(String key, int val) 插入 key-val 键值对，字符串表示键 key ，整数表示值 val 。如果键 key 已经存在，
 * 那么原来的键值对将被替代成新的键值对。
 * int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。
 * 算法：字典树
 */
public class _14_677 {
    class MapSum {
        Node node;

        public MapSum() {
            node = new Node();
        }

        public void insert(String key, int val) {
            Node cur = node;
            for (char c : key.toCharArray()) {
                if (cur.nodes[c - 'a'] == null) cur.nodes[c - 'a'] = new Node();
                cur = cur.nodes[c - 'a'];
            }
            cur.val = val;
        }

        public int sum(String prefix) {
            Node cur = node;
            for (char c : prefix.toCharArray()) {
                cur = cur.nodes[c - 'a'];
                if (cur == null) return 0;
            }
            return dfs(cur);
        }
        int dfs(Node node) {
            int res = 0;
            if (node == null) return res;
            res += node.val;
            for (int i = 0; i < 26; i++) res += dfs(node.nodes[i]);
            return res;
        }

    }

    class Node {
        Node[] nodes = new Node[26];
        int val = 0;
    }

}
